package administracion;

import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.List;

import dao.SucursalDAO;
import dto.DSucursalDTO;
import dto.EmpleadoDTO;
import dto.MesaDTO;
import dto.SucursalDTO;
import dto.TareaDTO;
import entity.DSucursal;
import entity.Mesa;
import entity.MesaSimple;
import entity.Sector;
import entity.Sucursal;

public class SucursalManager {

	private SucursalDAO dao = SucursalDAO.getInstancia();
	private static SucursalManager instancia;
	
	private SucursalManager(){
	}
	
	public static SucursalManager getInstancia(){
		if(instancia == null)
			instancia = new SucursalManager();
		return instancia;
	}
	
	public void altaSucursal(SucursalDTO sucursal) throws RemoteException{
		
		Sucursal s = dao.buscarSucursalNombre(sucursal.getNombre());
		
		if(s != null){
			throw new RemoteException("La Sucursal ya existe"); //Una exception nuestra
		}
		else{			
			s = new Sucursal(sucursal.getNombre());
			dao.altaSucursal(s);
		}
	}

	public Sucursal buscarSucursalNombre(SucursalDTO s) throws RemoteException {
		if(s != null){
			return dao.buscarSucursalNombre(s.getNombre());
		}else{
			throw new RemoteException("El nombre no es valido");
		}
	}

	public void merge(Sucursal sucursal) {
		if(sucursal != null)
			dao.merge(sucursal);
		
	}

	
	public List<SucursalDTO> listarSucursales() {
		List<Sucursal> lista = dao.listarSucursales();
		List<SucursalDTO> result = new ArrayList<SucursalDTO>();
		
		for(Sucursal s: lista){
			result.add(s.getDTO());
		}
		return result;
		
	}
	
	public void actualizarHsProduccion(Sucursal s){
		if(s != null)
			dao.actualizarHsProduccion(s);
	}

	public List<SucursalDTO> calcularOcupacionSuc(List<SucursalDTO> sucursales) {
		
		for(SucursalDTO s: sucursales){
			float hsDisponibles = s.getHsProduccion();
			//Me traigo todas las tareas de cada una de las sucursales
			List<TareaDTO> tareas = TareaManager.getInstancia().listarTareasDeSucursal(s.getNombre());
			
			if(tareas != null){
			//Por cada una de las tareas actualizo las horas disponibles de produccion
				for(TareaDTO t: tareas){
					hsDisponibles = hsDisponibles - t.getTiempoRequerido();
				}
				
				s.setHsDisponiblesProduccion(hsDisponibles);
				
				Sucursal suc = new Sucursal();
				suc.setHsDisponiblesProduccion(hsDisponibles);
				suc.setNombre(s.getNombre());
				
				actualizarHsProduccion(suc);
			}
		}
		
		return sucursales;
		
	}

	public DSucursalDTO buscarDSucursalUsuario(String legajo) {
		
		DSucursal d = dao.buscarDSucursalUsuario(legajo);
		DSucursalDTO result = new DSucursalDTO();
		
		if(d != null){
			result = d.toDTO();
		}
		
		return result;
	}

	public List<MesaDTO> getMesasOcupadas(EmpleadoDTO e) {
		Sucursal suc = dao.buscarSucursalCajero(e);
		List<MesaDTO> mesasVista = new ArrayList<MesaDTO>();
		
		List<Mesa> mesasFinal = dao.buscarMesasSucursal(suc);
		
		for(Mesa m: mesasFinal){
			mesasVista.add(m.getDTO());
		}
		
		return mesasVista;
	}

	
}
